#include <stdio.h>
#include <fcntl.h> // File Control open()/read()/write()/close()
#include <stdlib.h> // exit()
#include <unistd.h> // UNIX Standard  exit()

/**
 * 需求：利用系统调用实现love.txt的一个备份love2.txt，并在控制台输出文件内容,
 *      且多次执行在love2.txt再累加一份内容
 */

int main(int argc, char const *argv[])
{
    
    // 打开读的文件  love.txt
    // fd: 文件描述符， 是连接文件的标识值，后面可以通过此标识来操作文件
    int fd = open("love.txt", O_RDONLY);
    if (fd == -1)
    {
        perror("打开读的文件失败");
        return -1; // 失败的返回
    }

    // 打开写的文件  love2.txt
    int fd2 = open("love2.txt", O_CREAT|O_WRONLY|O_APPEND, 0777);
    if (fd2 == -1)
    {
        perror("打开写的文件失败");
        close(fd);
        return -1; // 失败的返回
    }

    // 边读边写并输出到控制台
    char buff[100];
    ssize_t read_size;
    while((read_size = read(fd, buff, 100)) > 0)  // 读love
    {
        // 写到love2
        write(fd2, buff, read_size);
        // 输出到控制台
        write(STDOUT_FILENO, buff, read_size);
    }

    // 如果读文件失败，输出错误提示并退出
    if (read_size == -1)
    {
        perror("读取文件数据出错");
        close(fd);
        close(fd2);
        // return -1;
        _exit(EXIT_FAILURE); // 失败的退出，不会自动关闭文件流
    }

    // 关闭文件
    // close(fd);
    // close(fd2);

    // return 0;
    exit(EXIT_SUCCESS); // 成功退出 exit会自动关闭文件流
}

/*
#define	STDIN_FILENO	0	标准输入（控制台输入）的fd
#define	STDOUT_FILENO	1	标准输出（控制台输出）的fd
#define	STDERR_FILENO	2	标准的错误输出（控制台输出）的fd
*/